#include<iostream>
#include<string>


//小例子求可变模板参数的参数个数
// template<class ...Args>
// void Print(Args&&... args)
// {
//     std::cout << sizeof...(args) << std::endl;//计算出可变模板函数包的个数

// }
// int main()
// {
//     double x = 2.2;
//     Print();
//     Print(1);
//     Print(1,std::string("111"));
//     Print(1,std::string("111"),x);
//     return 0;
// }


//包扩展(编译器底层生成可变模板的方法)
//法一:参数包递归调用
// void ShowList()
// {
//     std::cout << std::endl;
// }
// template<class T, class ...Args>
// void ShowList(T& t,Args&&... args)
// {
//     std::cout << t << std::endl;
//     ShowList(args...);
// }
// template<class ...Args>
// void Print(Args... args)
// {
//     ShowList(args...);
// }
// int main()
// {
//     double x = 2.2;
//     Print();
//     Print(1);
//     Print(2,std::string("111"));
//     Print(3,std::string("222"),x);
//     return 0;
// }

//方法二:函数调用包扩展
template <class T>
const T& GatArg(const T& x)
{
    std::cout << x << std::endl;
    return x;
}

template <class ...Args>
void ArgMents(Args... args)
{

}

template <class ...Args>
void Print(Args... args)
{
    ArgMents(GatArg(args)...);//从右向左解析
}


int main()
{
    Print();
    std::cout << std::endl;
    Print(1);
    std::cout << std::endl;
    Print(1,std::string("111"));
    std::cout << std::endl;
    Print(1,std::string("111"),2.2);

    return 0;
}